package admin

import (
	ct "context"
	"encoding/json"
	"fmt"
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"net/http"
	. "xm_shop/models"
	. "xm_shop/proto/rbacLogin"
	. "xm_shop/utils"
)

type LoginController struct{}

// 获取验证码接口
func (con LoginController) Captcha(context *gin.Context) {
	id, b64s, answer, err := MakeCaptcha(40, 100, 2) // 生成验证码
	fmt.Println(answer)
	if err != nil {
		fmt.Println(err)
	}
	context.JSON(http.StatusOK, gin.H{
		"CaptchaId":    id,
		"captchaImage": b64s,
	})
}

// 校验验证码
func (con LoginController) VerifyCaptcha(context *gin.Context) {
	captchaId := context.PostForm("captchaId") // 获取form表单格式的数据
	verifyValue := context.PostForm("verifyValue")
	if flag := VerifyCaptcha(captchaId, verifyValue); flag {
		context.String(http.StatusOK, "验证码成功")
		return
	}
	context.String(http.StatusOK, "验证码有误")
}

// 登录接口
func (con LoginController) Login(context *gin.Context) {
	captchaId := context.PostForm("captchaId")
	username := context.PostForm("username")
	password := context.PostForm("password")
	verifyValue := context.PostForm("verifyValue")

	// 校验验证码是否正确
	if flag := VerifyCaptcha(captchaId, verifyValue); flag {
		// 判断用户是否存在
		/*
			userInfo := []Manager{}
			DB.Where("username = ? AND password = ?", username, password).Find(&userInfo)
		*/
		// 调用微服务
		rbacClient := NewRbacLoginService("rbac", MicroClient)
		res, _ := rbacClient.Login(ct.Background(), &LoginRequest{
			Username: username,
			Password: Md5(password),
		})
		if res.IsLogin {
			// 执行登录, 保存用户信息
			session := sessions.Default(context) // 获取session
			userInfo := Manager{
				Username: res.UserList[0].Username,
				Mobile:   res.UserList[0].Mobile,
				Email:    res.UserList[0].Email,
				Status:   int(res.UserList[0].Status),
				RoleID:   int(res.UserList[0].RoleId),
				AddTime:  int(res.UserList[0].AddTime),
				IsSuper:  int(res.UserList[0].IsSuper),
			}
			// 注意:session.Set不能直接保存结构体切片,需要转换成字符串保存
			userInfoSlice, _ := json.Marshal(userInfo)     // 将结构体切片先转成字节切片
			session.Set("userInfo", string(userInfoSlice)) // 将字节切片转换成字符串
			session.Save()
			context.String(http.StatusOK, "登录成功")
		}
	}
	context.String(http.StatusOK, "登录失败")
}

// 登出接口
func (con LoginController) Logout(context *gin.Context) {
	session := sessions.Default(context)
	session.Delete("userInfo")
	session.Save()
	context.String(http.StatusOK, "退出成功")
}

func (con LoginController) Index(context *gin.Context) {
	/*
		//获取session中的useInfo
		session := sessions.Default(context)
		userInfoStringOrNil := session.Get("userInfo") // 抓不到为nil
		// 类型断言, 判断userInfoStringOrNil是不是string
		userInfoString, ok := userInfoStringOrNil.(string)
		if ok { // 如果断言成功
			// 获取到的是字符串, 转换成结构体切片
			userInfo := []Manager{}
			json.Unmarshal([]byte(userInfoString), &userInfo) // 先将字符串转换成字节切片, 然后转换成结构体切片
			context.JSON(http.StatusOK, gin.H{
				"userInfo": userInfo,
			})
		} else {
			context.JSON(http.StatusOK, gin.H{
				"error": "session不存在",
			})
			context.Abort() // 中断, 原路返回
		}
	*/

}
